import logging

# 配置日志记录器
logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

from PySide6.QtCore import Signal, QObject
输入接口自动取消冲突接口 = True


class 节点接口模型(QObject):
    """
    表示一个节点接口，包含接口的各种属性和方法。
    """
    图形项注册信号 = Signal(object)

    def __init__(self, 节点模型, 流类型, 方向, 接口名称=None, 数据类型=None, 必须连接=False, 序号=-1):
        super().__init__()
        self.调试模式 = False

        # 设置日志等级
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__} 调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)  # 只显示警告及以上级别的日志

        日志记录器.info("节点接口模型已初始化")

        if not 流类型:
            raise ValueError("流类型不能为空")
        if 方向 not in ["输入", "输出"]:
            raise ValueError("方向必须是 '输入' 或 '输出'")
        self.节点模型 = 节点模型
        self.流类型 = 流类型  # 流类型 = '数据流', '调用流', '执行流' 引用
        self.方向 = 方向  # 输入或输出
        self.接口名称 = 接口名称
        self.必须连接 = 必须连接  # 接口是否为必须连接
        self.接口状态 = ""  # 接口状态 异常 警告 正常
        self.数据类型 = 数据类型
        self.接口连接线模型列表 = []
        self.异常信息 = set()
        self.序号 = 序号
        self._节点ID = 节点模型._节点ID
        # 通用
        if self.方向 == "输入":
            self.关系数量限制 = 1
        else:
            self.关系数量限制 = 0
        # 起始接口.关系数量限制=关系数量限制# 0为无限制 其余为限制数量
        # 起始接口.更新接口状态()
        # 起始接口.基础图形项 = 接口图形项(起始接口)
        self.图形项 = None
        self.图形项注册信号.connect(self.图形项注册)

    def 图形项注册(self, 图形项):
        self.图形项 = 图形项
        日志记录器.debug(f"图形项已注册: {图形项}")
    def 刷新接口(self):
        if self.图形项:
            for 连接线模型 in self.接口连接线模型列表:
                if 连接线模型.图形项:
                    连接线模型.图形项.连接线图形项刷新()
    def __repr__(self):
        return f"接口模型({self.流类型}, {self.方向}, {self.接口名称}, {self.数据类型})"

    def 更新接口状态(self):
        self.接口状态检查()

    def 接口是否可以连接(self):
        日志记录器.debug(f"检查接口是否可以连接: {self}")
        if self.关系数量限制 == 0:
            return True
        else:
            return len(self.接口连接线模型列表) < self.关系数量限制

    def 接口状态检查(self):
        """
        更新接口的状态，根据连接线集合和数据类型进行判断。
        """
        日志记录器.debug(f"检查接口状态: {self}")
        if self.必须连接:
            异常信息 = "接口必须连接"
            if len(self.接口连接线模型列表) > 0:
                self.接口状态 = "正常"
                self.异常信息.discard(异常信息)
                日志记录器.info(f"接口状态更新为正常: {self}")
            else:
                self.接口状态 = "异常"
                self.异常信息.add(异常信息)
                日志记录器.error(f"接口必须连接但未连接: {self}")
                if self.调试模式:
                    日志记录器.debug(f"接口必须连接但未连接: {self}")
        else:
            if len(self.接口连接线模型列表) == 0:
                self.接口状态 = "警告"
                日志记录器.warning(f"接口状态更新为警告: {self}")

    def 接口创建连接线模型(self, 结束接口, 关系创建节点=None):
        日志记录器.debug(f"创建接口连接线模型: {self} -> {结束接口}")
        _连接线模型 = self.节点模型.创建连接线模型(self, 结束接口, 关系创建节点=关系创建节点)
        if _连接线模型:
            self.添加关系到接口关系列表(_连接线模型)
            日志记录器.info(f"连接线模型创建成功: {_连接线模型}")
            return _连接线模型
        else:
            日志记录器.error("创建连接线模型失败")
            return None

    def 添加关系到接口关系列表(self, _连接线模型):
        日志记录器.debug(f"添加关系到接口关系列表: {_连接线模型}")
        if _连接线模型 not in self.接口连接线模型列表:
            if self.方向 == "输出":
                self.接口连接线模型列表.append(_连接线模型)
                _连接线模型.结束接口.添加关系到接口关系列表(_连接线模型)
                if len(self.接口连接线模型列表) > 1 and self.节点模型._上层是否为控制节点:
                    for _连接线模型 in self.接口连接线模型列表:
                        _连接线模型.结束接口.节点模型._是控制节点 = True
            else:
                self.接口连接线模型列表.append(_连接线模型)
                if len(self.接口连接线模型列表) > 1:
                    for _连接线模型 in self.接口连接线模型列表:
                        _连接线模型.起始接口.节点模型._是控制节点 = True
                        _连接线模型.结束接口.节点模型._上层是否为控制节点 = True

    def 从接口删除关系(self, 连接线模型):
        日志记录器.debug(f"从接口删除关系: {连接线模型}")
        连接线模型.起始接口.从列表中删除关系(连接线模型)
        if (len(self.接口连接线模型列表) - 1) == 1:
            for 连接线模型 in self.接口连接线模型列表:
                连接线模型.起始接口.节点模型._是控制节点 = False
                # 连接线图形项.起始接口.节点模型.所属节点模型管理器.刷新控制流显示()
        连接线模型.结束接口.从列表中删除关系(连接线模型)
        日志记录器.debug(f"删除关系: {连接线模型.__class__.__name__}")
        连接线模型.删除连接线模型()

    def 从列表中删除关系(self, 连接线模型):
        日志记录器.debug(f"从列表中删除关系: {连接线模型}")
        self.接口连接线模型列表.remove(连接线模型)
        if 连接线模型 in self.节点模型.所属节点模型管理器.连接线列表:
            self.节点模型.所属节点模型管理器.连接线列表.remove(连接线模型)

    def 删除接口模型(self):
        日志记录器.debug(f"删除接口模型: {self}")
        for _连接线模型 in self.接口连接线模型列表:
            self.从接口删除关系(_连接线模型)
        del self

    def 获取接口连接数(self):
        日志记录器.debug(f"获取接口连接数: {self}")
        return len(self.接口连接线模型列表)

    def __hash__(self):
        """
        返回接口的哈希值。

        返回:
        接口的哈希值
        """
        日志记录器.debug(f"获取接口哈希值: {self}")
        return hash((self.流类型, self.方向, self.接口名称))

    def __eq__(self, 接口):
        """
        比较两个接口是否相等。

        参数:
        接口模型 -- 要比较的接口对象

        返回:
        是否相等（布尔值）
        """
        日志记录器.debug(f"比较接口是否相等: {self} == {接口}")
        if isinstance(接口, 节点接口模型):
            return (self.流类型, self.方向, self.接口名称) == (
                接口.流类型, 接口.方向, 接口.接口名称)
        return False
